/******************************************************************************
秋夜静，独坐对残灯。
啼笑非非谁识我，坐行梦梦尽缘君，何所慰消沉。
风卷雨，雨复卷侬心。
心似欲随风雨去，茫茫大海任浮沉。
无爱亦无恨。
******************************************************************************/
#include "kbRGB_Int.h"
//#include "kbRGB_Angle.h"
//#include "UGUI/ugui.h"
//#include "LCD/lcd.h"
#include "Curve/hsv.h"
#include "Effects/cledMatrix/cledMatrix.h"
#include <math.h>
#include <stdlib.h>
//#include <string.h>
#include "Effects/kbRGB_Int/kbRGB_Int_Effect.h"

struct kbRGB_Int_Params kbrgb_Int_Params;

static const struct kbRGB_Int_Effect_t kbrgb_Effect[] = {
    /*************************************************************************************************\
    |        Advanced [13-1]:0                                                                        |
    \*************************************************************************************************/
    {mled_view_kb_Init, mled_view_cnt},
    {NULL, mled_view_Crater},                                                  // 火山口
    {NULL, mled_view_EyeofSauron},                                             // 索伦之眼
    {mled_view_kb_Init, mled_view_ripple},
    /*************************************************************************************************\
    |        Advanced [13-1]:0                                                                        |
    \*************************************************************************************************/
    {kbRGB_Int_BouncingBallEffect_Init, kbRGB_Int_BouncingBallEffect},         // 55.99ms, 弹力球
    {kbRGB_Int_Bubbles_Init, kbRGB_Int_Bubbles},                               // 230.6ms, --气泡
    {kbRGB_Int_FractalMotion_Init, kbRGB_Int_FractalMotion},                   // 179.6ms, --分形运动
    {kbRGB_Int_Sinusoid_Init, kbRGB_Int_Sinusoid},                             // 179.6ms, 正弦曲线
    {kbRGB_Int_Sinusoid_Init, kbRGB_Int_SingleSinusoid},                       // 179.6ms, 单正弦曲线
    {kbRGB_Int_Sinusoid_Init, kbRGB_Int_DoubleSinusoid},                       // 179.6ms, 双正弦曲线
    {kbRGB_Int_GradientWave_Init, kbRGB_Int_GradientWave},                     // 3.183ms, 梯度波
    {kbRGB_Int_MovingPanes_Init, kbRGB_Int_MovingPanes},                       // 25.97ms, 移动窗格
    {kbRGB_Int_Rain_Init, kbRGB_Int_Rain},                                     // 2.496ms, 下雨
    {kbRGB_Int_SmoothBlink_Init, kbRGB_Int_SmoothBlink},                       // 6.043ms, 平滑闪烁
    {kbRGB_Int_Spiral_Init, kbRGB_Int_Spiral},                                 // 9.814ms, 螺旋效果
	{kbRGB_Int_Spiral_Init, kbRGB_Int_Winnower},                               // 9.814ms, 风车效果
    {kbRGB_Int_StarryNight_Init, kbRGB_Int_StarryNight},                       // 2.678ms, 星空
    {kbRGB_Int_SwirlCircles_Init, kbRGB_Int_SwirlCircles},                     // 52.29ms, --漩涡圈
    {kbRGB_Int_Wavy_Init, kbRGB_Int_Wavy},                                     // 2.877ms, 波形的
    {kbRGB_Int_ZigZag_Init, kbRGB_Int_ZigZag},                                 // 18.26ms, 之字形的
    /*************************************************************************************************\
    |        Beams [2]:12                                                                              |
    \*************************************************************************************************/
    {kbRGB_Int_CrossingBeams_Init, kbRGB_Int_CrossingBeams},                   // 24.57ms, 交叉梁
    {kbRGB_Int_RotatingBeam_Init, kbRGB_Int_RotatingBeam},                     // 26.23ms, 旋转射束
    /*************************************************************************************************\
    |        Rainbow [9-1]:14                                                                          |
    \*************************************************************************************************/
    {kbRGB_Int_ColorWheel_Init, kbRGB_Int_ColorWheel},                         // 11.81ms, 色轮
    {kbRGB_Int_DoubleRotatingRainbow_Init, kbRGB_Int_DoubleRotatingRainbow},   // 22.19ms, 双旋转彩虹
    {kbRGB_Int_Hypnotoad_Init, kbRGB_Int_Hypnotoad},                           // 42.08ms, Hypnotoad
    {kbRGB_Int_NoiseMap_Init, kbRGB_Int_NoiseMap},                             // 106.2ms, 噪声地图
    {kbRGB_Int_NoiseCircle_Init, kbRGB_Int_NoiseCircle},                       // 68.69ms, 噪声地图
    {kbRGB_Int_RainbowWave_Init, kbRGB_Int_RainbowWave},                       // 1.514ms, 彩虹波
    {kbRGB_Int_RadialRainbow_Init, kbRGB_Int_RadialRainbow},                   // 10.91ms, 径向彩虹
    {kbRGB_Int_RotatingRainbow_Init, kbRGB_Int_RotatingRainbow},               // 16.25ms, 旋转的彩虹
    {kbRGB_Int_SpectrumCycling_Init, kbRGB_Int_SpectrumCycling},               // 0.457ms, 光谱骑自行车
    /*************************************************************************************************\
    |        Random [2]:23                                                                             |
    \*************************************************************************************************/
    {kbRGB_Int_Bloom_Init, kbRGB_Int_Bloom},                                   // 11.16ms, 花朵
    {kbRGB_Int_Lightning_Init, kbRGB_Int_Lightning},                           // 5.835ms, 闪电
    /*************************************************************************************************\
    |        Simple [11]:25                                                                            |
    \*************************************************************************************************/
    {kbRGB_Int_Breathing_Init, kbRGB_Int_Breathing},                           // 9.478ms, 呼吸
    {kbRGB_Int_BreathingCircle_Init, kbRGB_Int_BreathingCircle},               // 34.74ms, 呼吸循环
    {kbRGB_Int_Comet_Init, kbRGB_Int_Comet},                                   // 2.615ms, 彗星
    {kbRGB_Int_Fill_Init, kbRGB_Int_Fill},                                     // 2.252ms, 充满
    {kbRGB_Int_Marquee_Init, kbRGB_Int_Marquee},                               // 1.258ms, 大天幕
    {kbRGB_Int_Mosaic_Init, kbRGB_Int_Mosaic},                                 // 13.93ms, 马赛克
    {kbRGB_Int_MotionPoint_Init, kbRGB_Int_MotionPoint},                       // 3.625ms, 运动点
    {kbRGB_Int_MotionPoints_Init, kbRGB_Int_MotionPoints},                     // 28.78ms, 运动点
    {kbRGB_Int_Stack_Init, kbRGB_Int_Stack},                                   // 0.775ms, 堆
    {kbRGB_Int_Swap_Init, kbRGB_Int_Swap},                                     // 0.839ms, 交换
    {kbRGB_Int_Visor_Init, kbRGB_Int_Visor},                                   // 6.726ms, 遮阳板
};
static const uint8_t kbrgb_effect_size = sizeof(kbrgb_Effect)/sizeof(kbrgb_Effect[0]);

static void kbRGB_memset(void *_Dst,int _Val,size_t _Size)
{
    uint8_t* const Dst = (uint8_t*)_Dst;
    size_t i;
    for(i=0; i<_Size; i++) Dst[i] = _Val;
}
struct mled_view_t* kbRGB_Int_mled_view(void)
{
	return &kbrgb_Int_Params.mled_view;
}
static void kbRGB_Int_Params_Init(void)
{
    kbRGB_memset(&kbrgb_Int_Params, 0x00, sizeof(kbrgb_Int_Params));
    kbrgb_Int_Params.time = 1000.0;
    kbrgb_Int_Params.FPS = 60;
    kbrgb_Int_Params.Speed = 50;
    kbrgb_Int_Params.Slider2Val = 20;
//    kbrgb_Int_Params.shape = 0;
    kbrgb_Int_Params.progress = 0.f;
}
static const uint16_t def = 7;
int16_t kbRGB_Int_Init(const uint8_t index)
{
//    kbrgb_Int_Params.time = 1000.0;
//    kbrgb_Int_Params.FPS = 60;
//    kbrgb_Int_Params.Speed = 100;
//    kbrgb_Int_Params.Slider2Val = 50;
    kbRGB_clear();
    kbRGB_Int_Params_Init();
    srand(tb_get_sys_time_ms());
	if(index<kbrgb_effect_size)
	{
		if(NULL!=kbrgb_Effect[index].Init) kbrgb_Effect[index].Init(&kbrgb_Int_Params);
		return index;
	}
	if(NULL!=kbrgb_Effect[def].Init) kbrgb_Effect[def].Init(&kbrgb_Int_Params);
	return -1;
}
//__weak uint16_t kb_rand(void)
//{
//	return rand();
//}

int kbRGB_Int_Effects(const uint8_t index, const uint16_t cols, const uint16_t rows, const uint32_t background, const uint8_t speed, const int reverse)
{
	kbrgb_Int_Params.background = background;
	if(index<kbrgb_effect_size)
	{
		if(NULL!=kbrgb_Effect[index].Effect) kbrgb_Effect[index].Effect(cols, rows, speed, reverse, &kbrgb_Int_Params);
		if(kbrgb_Int_Params.FPS<=0) kbrgb_Int_Params.FPS = 1;
		return (1000/(kbrgb_Int_Params.FPS+1));
	}
    if(NULL!=kbrgb_Effect[def].Effect) kbrgb_Effect[def].Effect(cols, rows, speed, reverse, &kbrgb_Int_Params);
	return -1;
}
